package br.org.bertol.mestrado;

import java.io.IOException;
import java.util.ArrayList;

import br.org.bertol.mestrado.engine.AbstractSearchEngine;
import br.org.bertol.mestrado.util.Configurator;

/**
 * @author contaqualquer
 * @param <E>
 *            Tipo de engine usado
 */
public abstract class AbstractStarter<E extends AbstractSearchEngine> {

    /***/
    protected transient ArrayList<E> engineList;

    /***/
    protected transient Configurator configurator;

    /**
     * @param configurator
     */
    protected AbstractStarter(final Configurator configurator) {
        this.configurator = configurator;

        engineList = new ArrayList<E>();
    }

    /**
     * @throws InterruptedException
     *             Erro ao sincronizar thread
     */
    public abstract void startEngine() throws InterruptedException;

    /**
     * Lista em motores de nusca instanciados.
     * @return Lista com todos os motores de busca instanciados
     */
    @SuppressWarnings("unchecked")
    public final ArrayList<E> getEngineList() {
        return (ArrayList<E>) engineList.clone();
    }

    /**
     * @throws IOException
     *             Erro ao manipular arquivo de saída
     */
    public abstract void save() throws IOException;

}
